/**
 * 验证码倒计时
 * @作者: 陈老师儿~
 * @手机: 18560000860
 */

import { ref, unref, onMounted, onBeforeUnmount } from "vue";

// key: 验证码的key，用于区分不同的验证码
// seconds: 倒计时时长，单位秒，默认为60秒
// endFn: 倒计时结束后的回调函数，默认为空函数
export function usePureCodeCountdown(key = "", seconds = 60, endFn = () => {}) {
    // 获取静态值
    seconds = unref(seconds);

    // 倒计时时长
    const _seconds = ref(seconds);

    // 定时器
    let timer = null;

    // 存储缓存的key
    const keyName = "pure_code_countdown_" + key;

    // 倒计时状态
    const isCountdown = ref(false);

    // 组件挂载时
    onMounted(() => {
        // 查找缓存的数据
        const cacheData = findCacheData();

        // 有缓存的数据
        if (cacheData) {
            // 继续倒计时
            goon(cacheData);
        }
    });

    // 组件卸载时
    onBeforeUnmount(() => {
        // 清除定时器
        clearTimer();
    });

    // 开始
    function start() {
        // 正在倒计时
        if (isCountdown.value) return;

        // 设置定时器，开始倒计时
        setTimer();
    }

    // 设置定时器，开始倒计时
    function setTimer() {
        // 先清除一下定时器
        clearTimer();

        // 更新倒计时状态
        isCountdown.value = true;

        // 缓存数据
        setCacheData();

        // 设置定时器，开始倒计时
        timer = setInterval(() => {
            // 倒计时结束
            if (_seconds.value <= 0) {
                // 清除定时器
                clearTimer();

                // 清除缓存数据
                clearCacheData();

                // 更新倒计时秒数
                _seconds.value = seconds;

                // 调用倒计时结束回调函数
                callEndFn();

                return;
            }

            // 倒计时减1
            _seconds.value--;

            // 缓存数据
            setCacheData();
        }, 1000);
    }

    // 清除定时器
    function clearTimer() {
        if (timer) {
            clearInterval(timer);
            timer = null;
        }

        // 更新倒计时状态
        isCountdown.value = false;
    }

    // 查找缓存的数据
    function findCacheData() {
        // 未设置key，不查找
        if (!key) return null;

        // 查找缓存的数据
        const storageData = uni.getStorageSync(keyName);
        return storageData;
    }

    // 缓存数据
    function setCacheData() {
        // 未设置key，不缓存
        if (!key) return;

        // 缓存数据
        const storageData = {
            seconds: _seconds.value,
            timestamp: Date.now(),
        };
        uni.setStorageSync(keyName, storageData);
    }

    // 清除缓存数据
    function clearCacheData() {
        // 未设置key，不缓存
        if (!key) return;

        // 清除缓存数据
        uni.removeStorageSync(keyName);
    }

    // 继续倒计时
    function goon(cacheData) {
        const { seconds: goonSeconds, timestamp } = cacheData;

        // 当前时间戳
        const nowTimestamp = Date.now();

        // 过去了多少秒
        const passSeconds = Math.ceil((nowTimestamp - timestamp) / 1000);

        // 还在倒计时范围内
        if (passSeconds <= goonSeconds) {
            // 更新倒计时秒数
            _seconds.value = goonSeconds - passSeconds;

            // 设置定时器，开始倒计时
            setTimer();

            return;
        }

        // 走完了
        _seconds.value = seconds;
        isCountdown.value = false;
        clearTimer();
        clearCacheData();
    }

    // 调用倒计时结束回调函数
    function callEndFn() {
        if (typeof endFn === "function") {
            endFn();
        }
    }

    return {
        seconds: _seconds,
        isCountdown,
        start,
        clear: clearCacheData,
    };
}
